gl renderer: Cache current scale in RenderOpBuilder
authorTimm Bäder <mail@baedert.org>
Fri, 29 Nov 2019 13:40:20 +0000 (14:40 +0100)
committerTimm Bäder <mail@baedert.org>
Tue, 3 Dec 2019 07:40:34 +0000 (08:40 +0100)
We call ops_get_scale a lot, so this should be better. It will also make
a later x/y split for the scaling easier.

gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h

index 4c6e2a7b35a3a4e282b4de74e8d264bc411dac31..1c4f679e433c6f77d122e6bea7d0cfb99b1ca8eb 100644 (file)
@@ -30,6 +30,8 @@ ops_finish (RenderOpBuilder *builder)
 
   builder->dx = 0;
   builder->dy = 0;
+  builder->scale_x = 1;
+  builder->scale_y = 1;
   builder->current_modelview = NULL;
   builder->current_clip = NULL;
   builder->current_render_target = 0;
@@ -84,16 +86,11 @@ ops_pop_debug_group (RenderOpBuilder *builder)
 float
 ops_get_scale (const RenderOpBuilder *builder)
 {
-  const MatrixStackEntry *head;
-
   g_assert (builder->mv_stack != NULL);
   g_assert (builder->mv_stack->len >= 1);
 
-  head = &g_array_index (builder->mv_stack, MatrixStackEntry, builder->mv_stack->len - 1);
-
   /* TODO: Use two separate values */
-  return MAX (head->metadata.scale_x,
-              head->metadata.scale_y);
+  return MAX (builder->scale_x, builder->scale_y);
 }
 
 static void
@@ -400,6 +397,8 @@ ops_set_modelview (RenderOpBuilder *builder,
   builder->dx = 0;
   builder->dy = 0;
   builder->current_modelview = entry->transform;
+  builder->scale_x = entry->metadata.scale_x;
+  builder->scale_y = entry->metadata.scale_y;
   ops_set_modelview_internal (builder, entry->transform);
 }
 
@@ -443,6 +442,8 @@ ops_push_modelview (RenderOpBuilder *builder,
 
   builder->dx = 0;
   builder->dy = 0;
+  builder->scale_x = entry->metadata.scale_x;
+  builder->scale_y = entry->metadata.scale_y;
   builder->current_modelview = entry->transform;
   ops_set_modelview_internal (builder, entry->transform);
 }
@@ -465,6 +466,8 @@ ops_pop_modelview (RenderOpBuilder *builder)
 
   if (builder->mv_stack->len >= 1)
     {
+      builder->scale_x = head->metadata.scale_x;
+      builder->scale_y = head->metadata.scale_y;
       builder->current_modelview = head->transform;
       ops_set_modelview_internal (builder, head->transform);
     }
index 93f504f2872d8664bd5c98a7703711cc99fdb160..75ae2ac5fd079112faa28bfb7a4b83e4a6b0acf6 100644 (file)
@@ -152,6 +152,7 @@ typedef struct
   graphene_rect_t current_viewport;
   float current_opacity;
   float dx, dy;
+  float scale_x, scale_y;
 
   OpBuffer render_ops;
   GArray *vertices;